package dominio.pacman;

import java.util.Collection;
import java.util.Iterator;


import dominio.comun.IComestible;
import dominio.comun.IMovible;
import dominio.comun.IPosicionable;
import dominio.comun.Posicion;
import dominio.comun.sentidosMovimiento.SentidoFactory;
import dominio.comun.sentidosMovimiento.SentidoMovimiento;
import dominio.juego.Juego;
import dominio.laberinto.Laberinto;



/**
 * @author RJC
 * @version 1.0
 * @created 16-jun-2012 11:59:29
 */
public class Pacman implements IPosicionable, IMovible {

	private static Pacman instance = null;
	private static Juego juegoAlQuePertenece = null;
	
	private SentidoMovimiento miSentidoMovimiento;
	private Posicion miPosicion;

	private Pacman(){
		miSentidoMovimiento = SentidoFactory.getSentidoQuieto();
	}
	
    private synchronized static void createInstance() {
        if (instance == null) { 
        	instance = new Pacman();
        }
    }
 
    public static Pacman getInstance() {
        createInstance();
        return instance;
    }
	
	public Pacman clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException(); 
	}
	
	public void setJuego(Juego unJuego){
		juegoAlQuePertenece = unJuego;
	}
	
	public Posicion getPosicion(){
		return miPosicion;
	}

	public void mover(){
		Posicion posicionAMover = miSentidoMovimiento.getSiguientePosicion(getPosicion());
		
		if (posicionAMover != null && Laberinto.getInstance().esVisitable(getPosicion(), posicionAMover)){
			miPosicion = posicionAMover;
		}
		
		Collection<IComestible> elementosAComer = Laberinto.getInstance().getComestibles(miPosicion);
		Iterator<IComestible> itAComer = elementosAComer.iterator();
		
		while (itAComer.hasNext()){
			itAComer.next().comer();
		}
	}
	
	public void matar(IPosicionable fantasmaAtacante){
		//pequenia verificacion para comprobar que no me quieran matar desde cualquier posicion
		if (miPosicion.comparateTo(fantasmaAtacante.getPosicion())){
			Juego.getInstance().perdio();
		}
	}
	
	public void setSentidoMovimiento(SentidoMovimiento nuevoSentido){
		miSentidoMovimiento= nuevoSentido;
	}
	
	public void setPosicion(Posicion nuevaPosicion){
		miPosicion= nuevaPosicion;
	}

	public SentidoMovimiento getMiSentidoMovimiento() {
		return miSentidoMovimiento;
	}

}